import { observer } from './observer/index'

export function initState(vm) {
  let opts = vm.$options
  if (opts.data) {
    initData(vm)
  }
  if (opts.props) {
    initProps()
  }
  if (opts.watch) {
    initWatch()
  }
  if (opts.computed) {
    initComputed()
  }
  if (opts.methods) {
    initMethods()
  }
}
function initProps() {}
function initWatch() {}
function initComputed() {}
function initMethods() {}

// 对data初始化
function initData(vm) {
  let data = vm.$options.data
  // data有两种情况 一个是对象 另外一个是函数的情况
  data = vm._data = typeof data === 'function' ? data.call(vm) : data // 这里要改变this的指向 从window指向vue实例
  // 代理data上的所有数据
  for (let key in data) {
    proxy(vm, '_data', key)
  }
  // 劫持data的数据
  observer(data)
}
function proxy(vm, source, key) {
  Object.defineProperty(vm, key, {
    get() {
      return vm[source][key]
    },
    set(newValue) {
      vm[source][key] = newValue
    },
  })
}
